package com.pan.structual.decorator;

import com.pan.structual.decorator.decorator.impl.YellowTextFrameDecorator;
import com.pan.structual.decorator.frame.MyFrame;
import com.pan.structual.decorator.frame.impl.BigFrame;
import com.pan.structual.decorator.decorator.impl.BlueBackgroundFrameDecorator;
import com.pan.structual.decorator.decorator.impl.RedBorderFrameDecorator;
import com.pan.structual.decorator.frame.impl.SmallFrame;

/**
 * 装饰器模式
 *优点：
 *
 * 灵活性：装饰器模式提供了比继承更多的灵活性。它允许系统动态地决定添加或移除某些功能。
 * 扩展性：装饰器模式在不改变原有对象的情况下，可以动态地给一个对象扩展功能，这使得它可以很容易地为单个对象添加多种功能。
 * 遵循开闭原则：装饰器模式完全遵守了开闭原则，即对扩展开放，对修改封闭。这意味着我们可以在不修改现有代码的基础上进行扩展。
 * 组合优于继承：通过使用组合关系来创建装饰对象，装饰器模式避免了继承带来的静态特征和高耦合度问题。
 * 缺点：
 *
 * 复杂性：过度使用装饰器模式会增加系统的复杂性，因为每添加一个新功能就可能产生一个新的装饰类。
 * 维护难度：随着装饰类的增多，维护的难度也会增加，尤其是在有大量装饰类时，理解和跟踪对象的装饰状态可能会变得困难。
 * 设计复杂性：虽然装饰器模式提供了灵活性，但设计一个合适的装饰器结构可能需要更细致的规划和考虑。
 *
 */

public class DecoratorApplication {

    public static void main(String[] args) {
        //创建一个窗口
        MyFrame myFrame = new BigFrame();
        //通过红色边框装饰器，为窗口添加红色边框
        myFrame = new RedBorderFrameDecorator(myFrame);
        //通过蓝色背景装饰器，为窗口设置蓝色背景
        myFrame = new BlueBackgroundFrameDecorator(myFrame);

        //透明的调用MyFrame本身
        myFrame.disposition();
        //显示的窗口是蓝色镶红边的，装饰器其作用了
        myFrame.use();



        MyFrame myFrame2 = new SmallFrame();
        myFrame2 = new RedBorderFrameDecorator(myFrame2);
//        myFrame2 = new BlueBackgroundFrameDecorator(myFrame2);
        myFrame2 = new YellowTextFrameDecorator(myFrame2,"114514151919810");
        myFrame2.disposition();
        myFrame2.use();
    }
}
